project(
    'phosphor-dbus-interfaces',
    'cpp',
    meson_version: '>=1.1.1',
    default_options: [
        'buildtype=debugoptimized',
        'cpp_std=c++23',
        'warning_level=3',
        'werror=true',
        'generate_md=' + (meson.is_subproject() ? 'false' : 'true'),
    ],
    version: '1.0.0',
)

sdbusplus_dep = dependency('sdbusplus')
sdbusplusplus_prog = find_program('sdbus++', native: true)
sdbuspp_gen_meson_prog = find_program('sdbus++-gen-meson', native: true)
sdbusplusplus_depfiles = files()
if sdbusplus_dep.type_name() == 'internal'
    sdbusplusplus_depfiles = subproject('sdbusplus').get_variable(
        'sdbusplusplus_depfiles',
    )
endif

# Parse options to determine appropriate subdirectories to support.
yaml_selected_subdirs = []
if get_option('data_com_ampere')
    yaml_selected_subdirs += 'com/ampere'
endif
if get_option('data_com_google')
    yaml_selected_subdirs += 'com/google'
endif
if get_option('data_com_ibm')
    yaml_selected_subdirs += 'com/ibm'
endif
if get_option('data_com_intel')
    yaml_selected_subdirs += 'com/intel'
endif
if get_option('data_com_meta')
    yaml_selected_subdirs += 'com/meta'
endif
if get_option('data_com_qualcomm')
    yaml_selected_subdirs += 'com/qualcomm'
endif
if get_option('data_org_freedesktop')
    yaml_selected_subdirs += 'org/freedesktop'
endif
if get_option('data_org_open_power')
    yaml_selected_subdirs += 'org/open_power'
endif
if get_option('data_xyz_openbmc_project')
    yaml_selected_subdirs += 'xyz/openbmc_project'
endif

# Install the selected YAML files.
inst_yaml_dir = get_option('datadir') / 'phosphor-dbus-yaml'
foreach d : yaml_selected_subdirs
    install_subdir(
        'yaml' / d,
        install_dir: inst_yaml_dir / d,
        strip_directory: true,
    )
endforeach

# If libphosphor_dbus was not enabled, exit out from here.  We installed
# the YAML which is all we are asked to do.
if not get_option('libphosphor_dbus')
    subdir_done()
endif

should_generate_cpp = true
should_generate_markdown = get_option('generate_md')
should_generate_registry = true

# Source the generated meson files.
subdir('gen')

# Source the extra target to copy registry files into a separate tree so they
# can be useful for dependees when we are built as a sub-project.
subdir('registry')

# Define and build libphosphor_dbus.so from the C++ files.
libphosphor_dbus = library(
    'phosphor_dbus',
    generated_sources,
    implicit_include_directories: false,
    include_directories: include_directories('gen'),
    dependencies: sdbusplus_dep,
    version: meson.project_version(),
    install: true,
)

import('pkgconfig').generate(
    libphosphor_dbus,
    name: meson.project_name(),
    version: meson.project_version(),
    description: 'Generated sdbusplus bindings for phosphor-dbus-interfaces',
    variables: [
        'yamldir=' + '${pc_sysrootdir}${prefix}' / inst_yaml_dir,
        'registry_dir=' + '${prefix}' / inst_registry_dir,
    ],
)

phosphor_dbus_interfaces_dep = declare_dependency(
    sources: [generated_headers, registry_target],
    include_directories: include_directories('gen'),
    link_with: libphosphor_dbus,
    dependencies: sdbusplus_dep,
    variables: [
        'yamldir=' + meson.project_source_root() / 'yaml',
        'registry_dir=' + registry_copy_dir,
    ],
)

if meson.is_subproject()
    phosphor_dbus_interfaces_dep = phosphor_dbus_interfaces_dep.as_system()
endif

meson.override_dependency(
    'phosphor-dbus-interfaces',
    phosphor_dbus_interfaces_dep,
)
